# -*- coding: utf-8 -*-
"""
学习打卡记录模型
目的：存储用户每次学习打卡的详细记录
职责：记录打卡日期、学习时长、笔记内容、心情、图片等信息
"""
from sqlalchemy import Column, Integer, String, Text, DateTime, SmallInteger, Date
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.sql import func

Base = declarative_base()

class StudyCheckIn(Base):
    """
    学习打卡记录数据模型
    目的：记录用户每次打卡的详细信息，用于统计和展示学习进度
    功能：存储打卡的科目、日期、时长、内容、心情、图片等完整信息
    设计：使用唯一约束(user_id, subject_id, check_in_date)防止同一天同一科目重复打卡
    """
    __tablename__ = 'study_check_ins'

    # 打卡记录唯一标识符，主键，自增
    id = Column(Integer, primary_key=True, autoincrement=True, comment='打卡记录唯一标识符')

    # 打卡用户ID，外键关联users表，标识是哪个用户的打卡记录
    user_id = Column(Integer, nullable=False, comment='打卡用户ID')

    # 打卡科目ID，外键关联study_subjects表，标识打卡的学习科目
    subject_id = Column(Integer, nullable=False, comment='打卡科目ID')

    # 打卡日期，用于统计和防重复打卡，只记录日期不记录具体时间
    check_in_date = Column(Date, nullable=False, comment='打卡日期')

    # 学习时长（分钟），记录本次学习花费的时间，可选字段
    duration_minutes = Column(Integer, nullable=True, comment='学习时长（分钟）')

    # 打卡笔记/学习内容，用户可以记录学习心得、笔记或学习内容摘要
    content = Column(Text, nullable=True, comment='打卡笔记/学习内容')

    # 学习心情，1-😞很差，2-😐一般，3-😊不错，4-😄很好，5-🤩超棒
    # 用于记录学习时的心理状态，可用于后续分析学习状态与效率的关系
    mood = Column(SmallInteger, nullable=True, comment='学习心情：1-很差，2-一般，3-不错，4-很好，5-超棒')

    # 打卡地点ID，外键关联locations表，记录打卡地理位置，可选
    location_id = Column(Integer, nullable=True, comment='打卡地点ID')

    # 打卡图片路径，多张图片用逗号分隔，支持学习成果截图等
    images = Column(String(1000), nullable=True, comment='打卡图片路径，多张图片用逗号分隔')

    # 状态，0-已删除（软删除），1-正常
    status = Column(SmallInteger, nullable=False, default=1, comment='状态：0-已删除，1-正常')

    # 打卡时间，记录打卡的具体时间戳
    created_at = Column(DateTime, nullable=False, comment='打卡时间')

    # 更新时间，记录打卡记录最后修改的时间
    updated_at = Column(DateTime, nullable=False, comment='更新时间')

    def to_dict(self, include_content=True):
        """
        将打卡记录对象转换为字典格式
        目的：方便API响应序列化，将数据库模型转换为JSON可序列化的格式
        功能：返回包含打卡记录所有字段的字典，支持选择性返回内容字段

        Args:
            include_content (bool): 是否包含打卡笔记内容，列表查询时可以设为False以提高性能

        Returns:
            dict: 包含打卡记录信息的字典对象
        """
        # 基础字段，所有场景都返回
        result = {
            'id': self.id,
            'user_id': self.user_id,
            'subject_id': self.subject_id,
            'check_in_date': self.check_in_date.isoformat() if self.check_in_date else None,
            'duration_minutes': self.duration_minutes,
            'mood': self.mood,
            'location_id': self.location_id,
            'images': self.images.split(',') if self.images else [],  # 将逗号分隔的字符串转换为数组
            'status': self.status,
            'created_at': self.created_at.isoformat() if self.created_at else None,
            'updated_at': self.updated_at.isoformat() if self.updated_at else None
        }

        # 打卡笔记内容可能很长，列表查询时可以不返回以提高性能
        if include_content:
            result['content'] = self.content

        return result
